(() => {
  abstract class Animal {
    //我们不希望直接用Animal来创建实例，我们只需要让它是一个超类 用来被继承
    //所以我们给它加上abstract   那么这个类就只能被继承    不能用它创建实例
    //抽象类可以添加抽象方法
    name: string;

    constructor(name: string) {
      this.name = name;
    }
    //抽象方法只能在抽象类里定义  抽象方法没有方法体
    //子类必须对抽象方法进行重写
    abstract sayHello(): void;
  }

  class Dog extends Animal {
    //非抽象类继承抽象类 必须重写父类中的抽象方法
    sayHello(): void {
      console.log("汪汪汪");
    }
  }

  const dog = new Dog("旺财");
  dog.sayHello();
})();
